package io;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.Scanner;

/*
* 自行完成流连接的创建*/
public class PWDemo2 {
    public static void main(String[] args) throws FileNotFoundException {
        //1.创建文件流(低级流,字节流):向文件中写入字节数据
        /*追加内容在文件流上进行
        * 转换流设置字符集问题
        * 缓冲流设置缓存大小--块读写
        * 所有的字符输出流都有flash()方法*/
        FileOutputStream fos = new FileOutputStream("src/io/pw2.txt",true);//如果希望对文件追加写，要在这里打开追加模式
        //2.创建转换流(高级流,字符流):衔接字符流与字节流,负责将写出的字符变为字节
        OutputStreamWriter osw = new OutputStreamWriter(fos, StandardCharsets.UTF_8);//若需要明确字符集，则应当在转换流上指定
        //3.创建缓冲字符流(高级流,字符流):块写文本数据加速
        BufferedWriter bw = new BufferedWriter(osw);//此处设置缓冲区大小
        //4.创建PrinterWriter(高级流,字符流):按行写出字符串,自动行刷新
        /*
        * 当我们主动降PrinterWriter连接在一个流上时(构造方法的第一个参数为连接在哪个流上)
        * 那么PrinterWriter的构造器就支持再传入一个boolean型参数的重载,如果这个值为true,则打开了自动行刷新功能.
        * 所谓自动行刷新:
        * 当我们使用println方法写出一行字符串时,会自动进行一次flush动作。
            注意:调用write，print方法是不会自动flush的。*/
        PrintWriter pw = new PrintWriter(bw,true);
/*
            实现简易记事本功能。
            将控制台上输入的每一行字符串都按行写入到文件里
            如果在控制台上单独输入exit,则程序退出。
         */
        System.out.println("请输入记事本内容:(exit退出)");
        Scanner scan = new Scanner(System.in);
//        String content ="";
        /*
        while (true){
            String content = scan.nextLine();
            /*
                开发中如果出现字符串变量与字面量(直接量)进行equals比较时，要使用
                字面量.equals(变量)的形式。因为字面量一定非空，可以避免空指针的产生

            if ("exit".equals(content)){//退出  如果content为null,会空指针
                break;
            }
            pw.println(content);
            /*java中所有的输出流(无论是字符还是字节流)都支持flush方法。
                不过只有缓冲流的flush是真实将自身缓冲区中缓存的数据做强制写出的。
                而其他的高级流中flush方法的实现仅仅是调用了其连接的流的flush，将
                该动作传递下去。
//            pw.flush();
            System.out.println("已写入");
        }

             */

        String content = scan.nextLine();
        while (!("exit".equals(content))){
            pw.println(content);
            System.out.println("已写入");
            content = scan.nextLine();
        }
        pw.close();
        System.out.println("写入完毕");

    }
}
